#include <iostream>
#include <vector>
#include <list>

// 容器的迭代器失效问题：默认失效，不要重复去用前面的迭代器
// 所谓的失不失效就是看原来的元素位置动了没有，它原来的内存地址动了，那指针就是动了（迭代器就相当于是指针）
int main()
{
    std::vector v = {1, 2, 3, 4, 5, 6};
    auto ite = v.begin();

    // 尾插不一定失效：如果容器有足够的空间给你尾插，不用扩容，迭代器就不会失效，如果容器扩容了，迭代器就失效了
    // 容器扩容之后原来的数组就都没了，会构建一个新的数组（delete array[]; array = new p）
    v.push_back(1);

    // 尾删不失效
    v.pop_back();

    // 中间插不一定失效
    // 不扩容：插入位置前的不失效，位置后的失效
    // 扩容：都失效
    v.insert(v.begin() + 1, 99);

    // 删除不一定失效
    // 删除位置前的不失效，位置后的失效
    v.erase(v.begin() + 2);

    // 链表：不管在任何位置插入还是删除，都不会影响到任何其他节点，所以迭代器不会失效
    // 所以从这个角度再次佐证了：如果存在数据要大量插入和删除的情况，用list容器是最好的
    std::list<int> l;

    // set map 一定会失效：平衡二叉树要维持平衡（虽然重新修正平衡二叉树的时候，存在没有修正到某个节点的情况）

    // 在真实开发中，不会去考虑某个迭代器在这种情况下会不会失效的问题
    // 都会默认失效，不重复去用前面的迭代器

    return 0;
}